/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.util;

import br.com.foxinline.enums.ComposicaoFamiliar;
import br.com.foxinline.enums.EstadoCivil;
import br.com.foxinline.enums.RendaFamiliar;
import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.Anexo;
import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.Endereco;
import br.com.foxinline.modelo.Proprietario;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 *
 * @author nayra
 */
public class ProprietarioMerge {

    private Proprietario propInclusao;
    private Proprietario propAlteracao;
    private List<Campo<?>> campos;
    private List<Campo<?>> cEndereco;
    private Endereco enderecoIncluido;
    private Boolean usarEnderecoIncluido;
    private Campo<Proprietario> conjugeIncluido;
    private Boolean usarConjugeIncluido;
    private List<Campo<Anexo>> anexosIncluidos;
    private ProprietarioMerge conjugeMerge;
    private Boolean usarEndConjIncluido;
    private Boolean temDiferenca;

    public ProprietarioMerge(Proprietario p1, Proprietario p2, Boolean isConjuge) {
        this.propInclusao = p1;
        this.propAlteracao = p2;

        this.campos = new ArrayList<Campo<?>>();
        this.anexosIncluidos = new ArrayList<Campo<Anexo>>();
        this.usarEnderecoIncluido = true;
        this.usarEndConjIncluido = true;
        this.usarConjugeIncluido = true;
        this.temDiferenca = false;

        addCampo(new Campo<String>("Nome", "nome", p1.getNome(), p2.getNome(), String.class), this.campos);
        addCampo(new Campo<String>("CPF", "cpf", p1.getCpf(), p2.getCpf(), String.class), this.campos);
        addCampo(new Campo<String>("CNPJ", "cnpj", p1.getCnpj(), p2.getCnpj(), String.class), this.campos);
        addCampo(new Campo<String>("Nome Fantasia", "nomeFantasia", p1.getNomeFantasia(), p2.getNomeFantasia(), String.class), this.campos);
        addCampo(new Campo<String>("RG", "rg", p1.getRg(), p2.getRg(), String.class), this.campos);
        addCampo(new Campo<String>("Orgão Emissor", "orgaoEmissor", p1.getOrgaoEmissor(), p2.getOrgaoEmissor(), String.class), this.campos);
        addCampo(new Campo<String>("Profissão", "profissao", p1.getProfissao(), p2.getProfissao(), String.class), this.campos);
        addCampo(new Campo<String>("Local de Trabalho", "localTrabalho", p1.getLocalTrabalho(), p2.getLocalTrabalho(), String.class), this.campos);
        addCampo(new Campo<String>("Telefone", "telefone", p1.getTelefone(), p2.getTelefone(), String.class), this.campos);
        addCampo(new Campo<String>("Tempo Moradia", "tempoMoradia", p1.getTempoMoradia(), p2.getTempoMoradia(), String.class), this.campos);
        addCampo(new Campo<String>("Tempo Mor. no Mun.", "tempoMoradiaMunicipio", p1.getTempoMoradiaMunicipio(), p2.getTempoMoradiaMunicipio(), String.class), this.campos);
        addCampo(new Campo<Boolean>("Bolsa Família", "bolsaFamilia", p1.getBolsaFamilia(), p2.getBolsaFamilia(), Boolean.class), this.campos);
        addCampo(new Campo<Boolean>("Minha Casa Minha Vida", "minhaCasaMinhaVida", p1.getMinhaCasaMinhaVida(), p2.getMinhaCasaMinhaVida(), Boolean.class), this.campos);
        addCampo(new Campo<Double>("Vlr da Bolsa Família", "valorBolsaFamilia", p1.getValorBolsaFamilia(), p2.getValorBolsaFamilia(), Double.class), this.campos);
        addCampo(new Campo<Date>("Dt. de Nasc.", "dataNasc", p1.getDataNasc(), p2.getDataNasc(), Date.class), this.campos);
        addCampo(new Campo<TipoDocumento>("Tipo de Documento", "tipoDocumento", p1.getTipoDocumento(), p2.getTipoDocumento(), TipoDocumento.class), this.campos);
        addCampo(new Campo<EstadoCivil>("Estado Civil", "estadoCivil", p1.getEstadoCivil(), p2.getEstadoCivil(), EstadoCivil.class), this.campos);
        addCampo(new Campo<ComposicaoFamiliar>("Comp. Familiar", "composicaoFamiliar", p1.getComposicaoFamiliar(), p2.getComposicaoFamiliar(), ComposicaoFamiliar.class), this.campos);
        addCampo(new Campo<RendaFamiliar>("Renda Familiar", "rendaFamiliar", p1.getRendaFamiliar(), p2.getRendaFamiliar(), RendaFamiliar.class), this.campos);

        Endereco endInc = p1.getEndereco();
        Endereco endAlt2 = p2.getEndereco();
        if (endAlt2 != null) {
            if (endInc == null || (endInc != null && endInc.equals(new Endereco()))) {
                this.enderecoIncluido = endAlt2;
            } else {
                this.cEndereco = new ArrayList<Campo<?>>();
                addCampo(new Campo<String>("Logradouro", "logradouro", endInc.getLogradouro(), endAlt2.getLogradouro(), String.class), cEndereco);
                addCampo(new Campo<String>("Número", "numero", endInc.getNumero(), endAlt2.getNumero(), String.class), cEndereco);
                addCampo(new Campo<String>("Complemento", "compl", endInc.getCompl(), endAlt2.getCompl(), String.class), cEndereco);
                addCampo(new Campo<Bairro>("Bairro", "bairroDne", endInc.getBairroDne(), endAlt2.getBairroDne(), Bairro.class), cEndereco);
                addCampo(new Campo<String>("Município", "municipio", endInc.getMunicipio(), endAlt2.getMunicipio(), String.class), cEndereco);
                addCampo(new Campo<String>("CEP", "cep", endInc.getCep(), endAlt2.getCep(), String.class), cEndereco);
            }
        }

        //Anexos
        if (p2.getAnexos() != null) {
            for (Anexo anexo : p2.getAnexos()) {
                this.anexosIncluidos.add(new Campo(anexo, Anexo.class, true));
            }
        }

        if (!isConjuge) {
            if (p2.getConjuge() != null) {
                if (p1.getConjuge() == null || (p1.getConjuge() != null && p1.getConjuge().equals(new Proprietario()))) {
                    this.conjugeIncluido = new Campo<Proprietario>(p2.getConjuge(), Proprietario.class, true);
                } else {
                    this.conjugeMerge = new ProprietarioMerge(p1.getConjuge(), p2.getConjuge(), true);
                }
            }
        }

        if (campos.isEmpty() && (cEndereco == null || (cEndereco != null && cEndereco.isEmpty()))
                && (this.enderecoIncluido == null || (this.enderecoIncluido != null && this.enderecoIncluido.isCamposNulos())) && (conjugeIncluido == null) && (anexosIncluidos == null || (anexosIncluidos != null && anexosIncluidos.isEmpty()))
                && (conjugeMerge == null || (conjugeMerge != null && !conjugeMerge.temDiferenca))) {
            this.temDiferenca = false;
        } else {
            this.temDiferenca = true;
        }

    }

    private void addCampo(Campo cp, List<Campo<?>> list) {
        if (cp.getDiferente()) {
            list.add(cp);
        }
    }

    public List<Campo<?>> getcEndereco() {
        return cEndereco;
    }

    public void setcEndereco(List<Campo<?>> camposEnd) {
        this.cEndereco = camposEnd;
    }

    public List<Campo<Anexo>> getAnexosIncluidos() {
        return anexosIncluidos;
    }

    public void setAnexosIncluidos(List<Campo<Anexo>> aneAlt) {
        this.anexosIncluidos = aneAlt;
    }

    public ProprietarioMerge getConjugeMerge() {
        return conjugeMerge;
    }

    public void setConjugeMerge(ProprietarioMerge conjuge) {
        this.conjugeMerge = conjuge;
    }

    public List<Campo<?>> getCampos() {
        return campos;
    }

    public void setCampos(List<Campo<?>> campos) {
        this.campos = campos;
    }

    public Proprietario getPropInclusao() {
        return propInclusao;
    }

    public void setPropInclusao(Proprietario propInc) {
        this.propInclusao = propInc;
    }

    public Proprietario getPropAlteracao() {
        return propAlteracao;
    }

    public void setPropAlteracao(Proprietario propAlt) {
        this.propAlteracao = propAlt;
    }

    public Campo<Proprietario> getConjugeIncluido() {
        return conjugeIncluido;
    }

    public void setConjugeIncluido(Campo<Proprietario> conjugeAlt) {
        this.conjugeIncluido = conjugeAlt;
    }

    public Endereco getEnderecoIncluido() {
        return enderecoIncluido;
    }

    public void setEnderecoIncluido(Endereco endAlt) {
        this.enderecoIncluido = endAlt;
    }

    public Boolean getUsarEnderecoIncluido() {
        return usarEnderecoIncluido;
    }

    public void setUsarEnderecoIncluido(Boolean usarEndAlt) {
        this.usarEnderecoIncluido = usarEndAlt;
    }

    public Boolean getUsarEndConjIncluido() {
        return usarEndConjIncluido;
    }

    public void setUsarEndConjIncluido(Boolean usarEndConjAlt) {
        this.usarEndConjIncluido = usarEndConjAlt;
    }

    public Boolean getUsarConjugeIncluido() {
        return usarConjugeIncluido;
    }

    public void setUsarConjugeIncluido(Boolean usarConjAlt) {
        this.usarConjugeIncluido = usarConjAlt;
    }

    public Boolean getTemDiferenca() {
        return temDiferenca;
    }

    public void setTemDiferenca(Boolean temDiferenca) {
        this.temDiferenca = temDiferenca;
    }
}
